package com.cainaer.common.core.sms;

import com.baidubce.auth.DefaultBceCredentials;
import com.baidubce.services.sms.SmsClient;
import com.baidubce.services.sms.SmsClientConfiguration;
import com.baidubce.services.sms.model.SendMessageV3Request;
import com.baidubce.services.sms.model.SendMessageV3Response;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.util.HashMap;
import java.util.Map;

/**
 * @author-> tina
 * @date-> 2020/9/5 上午10:26
 * @version-> 1.0
 * @description-> 百度手机验证码
 **/
public class SmsCode {


    private static final Logger logger = LoggerFactory.getLogger(SmsCode.class);

    //对应发送的验证码
    private static String ACCESS_KEY_ID = "2504b0280a29471da20d3f5d097d73b3";
    private static String SECRET_ACCESS_KEY = "6afc3b9bf342447eac13a8e02916b152";
    private static String ENDPOINT = "http://smsv3.bj.baidubce.com";


    /**
     * 发送验证码
     *
     * @param tel
     * @return
     */
    public static String send(String tel) {
        int VERIFICATION_CODE = (int) ((Math.random() * 9 + 1) * 100000);
        SmsClientConfiguration config = new SmsClientConfiguration();
        config.setCredentials(new DefaultBceCredentials(ACCESS_KEY_ID, SECRET_ACCESS_KEY));
        config.setEndpoint(ENDPOINT);
        SmsClient client = new SmsClient(config);

        SendMessageV3Request request = new SendMessageV3Request();
        request.setMobile(tel);
        request.setSignatureId("sms-sign-hkoyeh80048");
        request.setTemplate("sms-tmpl-EHgkfo55088");
        Map<String, String> contentVar = new HashMap<>();
        contentVar.put("code", String.valueOf(VERIFICATION_CODE));
        contentVar.put("minute", "5");
        request.setContentVar(contentVar);
        SendMessageV3Response response = client.sendMessage(request);
        // 解析请求响应 response.isSuccess()为true 表示成功
        if (response != null && response.isSuccess()) {
          // redisService.set("VerificationCode:"+tel+":",code,360);
            return String.valueOf(VERIFICATION_CODE);
        }
        return null;
    }

    public static void main(String[] args) {
        String send = send("18318121630");
        System.out.println(send);
    }


    /**
     *
     * @param mobile
     * @param type
     * @param imgCode
     * @param request
     * @return public Result findCode(String mobile, String type, String imgCode, HttpServletRequest request) {
    //mobile字段是传入的用户名，即手机号，必传字段；
    //type是传入的须要发送的短信类型，必传字段，如登陆，注册等（也能够不区分，按我的爱好喽）；
    //imgCode是传入的图形验证码，非必传字段，由于只有今日第四次调用该接口时才须要校验图形验证码

    Result result = new Result();

    //校验请求参数是否正确
    if (StringUtils.isBlank(mobile) || StringUtils.isBlank(type)) {
    result.setSuccess(false);
    result.setMsg("请求参数不全");
    return result;
    }

    mobile = mobile.trim();
    // 判断传入的手机号格式是否正确
    if (mobile.length() != 11 || !MobileUtil.isMobileNum(mobile)) {
    result.setSuccess(false);
    result.setMsg("手机号格式不正确");
    return result;
    }

    // 要发送的短信验证码，生成六位数字验证码
    String mobileCode = (int) ((Math.random() * 9 + 1) * 100000) + "";

    String modelCode = null;//我这里使用的是阿里云的短信服务，调用阿里云的短信接口须要传入一个模板code参数，这个code再你申请短信模板时就会产生，且固定的值

    //判断当前要发送的是哪一种类型的短信，不一样的类型的验证码应该进行区分，这样能够提升用户体验；区分的参数由调用者（前端开发人员）传入，一般不会出现参数不存在的问题
    switch (type) {
    case "register":// 发送注册的短信验证码

    //核心业务隐身符1，用手机号去本身数据库查询当前用户是否存在，若是存在，则不能发送该类手机验证码，提示用户直接登陆手机号已注册"

    if ("") {//伪代码
    result.setSuccess(false);
    result.setMsg("当前手机号已注册，请直接登陆");
    return result;
    }

    modelCode = "SMS_123456788";
    break;

    case "reset":// 发送重置登陆密码的短信验证码

    //核心业务隐身符1，用手机号去本身数据库查询当前用户是否存在，若是不存在，则不能发送该类手机验证码，提示用户注册
    if (手机号未注册) {//伪代码
    result.setSuccess(false);
    result.setMsg("当前手机号未注册，请先登陆");
    return result;
    }

    modelCode = "SMS_987654321";
    break;

    default:
    result.setSuccess(false);
    result.setMsg("非法请求");
    return result;
    }

    String mobileKey = type + "_mobile_" + mobile;
    String todayKey = "today_mobile_code_times_" + mobile;

    // 验证码三十分钟内有效,而且距离上一次发送要超过2分钟的时间才能从新发送
    Long times = RedisUtils.ttl(mobileKey);
    if (times > 60 * 28) {
    result.setSuccess(false);
    result.setMsg("距离您上次发送验证码不足两分钟，请两分钟后再尝试获取");
    return result;
    }

    // 判断当前手机号今天发送密码次数是否已达上线,天天15条（具体条数根据本身的需求调用）
    String todayTimes = RedisUtils.get(todayKey);
    int todayCount = 1;
    if (todayTimes != null) {
    todayCount = new Integer(todayTimes);
    if (todayCount >= 15) {

    //此时还能够记录当前用户的手机号，ip，调用的短信验证码类型到表中，方便系统记录与分析。系统能够分析该用户该周该月调用短信接口的次数
    //由此来分析该ip的用户是不是正常的用户，若是调用太频繁，好比连续一周或数周都在调用该接口，系统能够暂时禁用该ip发来的请求，或者下降该手机号获取短信验证码的次数
    //通常大网站一般都得使用大数据来监控了，而小网站，就不必整的这么复杂了

    result.setSuccess(false);
    result.setMsg("当前手机号今日发送验证码已达上限，请明日再来");
    return result;
    }
    todayCount++;
    }

    //今天发送短信超过三次，再次调用接口时，须要调谷歌图形验证码
    if (todayCount > 3) {
    result.setStatus(1);//只要今日获取验证码次数超过三次，以后每次获取都要谷歌验证码，这个标识返回给前端，前端看到这个值，须要调用谷歌图形验证码，待用户输入图形验证码后才能调用该接口

    if (StringUtils.isBlank(imgCode)) {
    result.setSuccess(false);
    result.setMsg("为保证您帐号安全，本次请求须要输入图形验证码");
    return result;
    }

    // 检验图形验证码
    String kapchatKey = type + "_kaptcha_" + mobile;
    String kapchat = RedisUtils.get(kapchatKey);//获取redis数据库保存的谷歌图形验证码
    if (kapchat == null) {
    result.setMsg("图形验证码已失效，请从新输入");
    result.setSuccess(false);
    return result;
    } else if (!kapchat.equals(imgCode.toLowerCase())) {
    result.setSuccess(false);
    result.setMsg("您输入的验证码错误，请从新输入");
    return result;
    }
    } else if (todayCount == 3) {
    result.setStatus(1);//这已经是第三次调用，下次调用时，就得传入谷歌验证码
    }

    String msg = "";//发送短信验证码是否成功与失败

    try {

    //发送短信验证码，请求成功后返回指定标识，请求失败，能够返回失败的信息，方便开发人员排查bug
    //此处使用的是阿里云的短信服务，你也可使用其余的短信服务，此处不作赘述
    msg = MobileCodeUtils.sendCode(mobile, modelCode, mobileCode);

    logger.info("手机号:" + mobile + " 的验证码是：" + mobileCode);

    if (msg != null && "SUCCESS".equals(msg)) {
    result.setSuccess(true);
    result.setMsg("您的手机验证码发送成功，请注意查收，本验证码30分钟内有效");

    // 保存验证码到redis
    RedisUtils.set(mobileKey, mobileCode, 60 * 30 + 5);//redis中的code比实际要多5秒

    // 记录本号码发送验证码次数
    RedisUtils.set(todayKey, todayCount + "", MobileUtil.getSurplusTime());

    // 删除图形验证码
    RedisUtils.del(kapchatKey);

    } else {
    result.setSuccess(false);
    result.setMsg("短信验证码发送失败：" + msg);
    return result;
    }

    } catch (Exception e) {
    result.setSuccess(false);
    result.setMsg("获取短信验证码异常:" + e.getMessage());
    logger.info("获取手机验证码异常：" + e.getMessage());
    return result;
    }

    //此处须要添加操做流水，记录哪一个手机号，哪一个ip，哪一个时间调用了哪一种类型的接口


    return result;
    }
     */


}
